# load in the Seurat package
library(Seurat)
Loading required package: ggplot2
Loading required package: cowplot
Attaching package: ‘cowplot’
The following object is masked from ‘package:ggplot2’:
ggsave
Loading required package: Matrix
# set your working directory
directory<-setwd("/Users/paigevega/Desktop/CQS_2018_DiscoveryOrientedDataScience")
# load in the data
# 35,635 rows (genes)
# 13,019 cells (names are barcodes)
pbmc.data <- read.table(paste(directory,"/immune_control_expression_matrix.txt.gz", sep = ""), sep = "\t")
# Create the Seurat object with the raw (non-normalized data). Keep all genes expressed in >= 5 cells.
pbmc <- CreateSeuratObject(raw.data = pbmc.data, min.cells = 5, project = "control_PBMC")
# pbmc@raw.data
# The number of genes and UMIs (nGene and nUMI) are automatically calculated
# for every object by Seurat. Use violin plots to visualize number genes and number UMIs.
VlnPlot(object = pbmc, features.plot = c("nGene", "nUMI"), nCol = 2, point.size.use = 0.01)
# Note: finding the percent mitochondrial genes for a dataset is a common QC metric, but, this dataset is already pre-processed to remove cells that have mitochondrial gene expression.
# GenePlot is typically used to visualize gene-gene relationships, but can be used to see how any two variables correlate. We will use it to see how number UMIs correlate to number of genes.
# by the way, what would be "bad" and what would be "good"?
# bad = low nGene with high nUMI => means there are few types of genes with high expression
# good = linear correlation nGene to nUMI, with nUMI about 3-5X greater than nGene
GenePlot(object = pbmc, gene1 = "nUMI", gene2 = "nGene")
# Note: if you're trying to remove cells expressing high % mitochondrial genes, plot nUMI to % mito and QC from there.
# Based on the violin plot, filter out cells by choosing low and high thresholds.
# get rid of cells with very few nGenes or way too many nGene
pbmc <- FilterCells(object = pbmc, subset.names = "nGene", low.thresholds = 200, high.thresholds = 1800)
# if you were removing cells with high % mito expression, remove them here with appropriate thresholds.
# pbmc@raw.data
# Normalize the data - log normalization is default.
pbmc <- NormalizeData(object = pbmc)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# pbmc@data
# Find the top 1,000 most variable genes
# Calculates average expression and dispersion, using z-scores to determine outliers, which accounts for the relationship between variability and avg expression.
pbmc <- FindVariableGenes(pbmc)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# pbmc@var.genes # contains variable genes
# pbmc@hvg.info # contains results of HVG analysis
# removes "uninteresting sources of variation", like technical noise, or cell cycle
# linear regression to predict gene expression. See ?ScaleData for more information.
pbmc <- ScaleData(pbmc)
Scaling data matrix
|
| | 0%
|
|====== | 7%
|
|=========== | 14%
|
|================= | 21%
|
|======================= | 29%
|
|============================= | 36%
|
|================================== | 43%
|
|======================================== | 50%
|
|============================================== | 57%
|
|=================================================== | 64%
|
|========================================================= | 71%
|
|=============================================================== | 79%
|
|===================================================================== | 86%
|
|========================================================================== | 93%
|
|================================================================================| 100%
# pbmc@scale.data
# Run PCA using the HVGs
pbmc <- RunPCA(object = pbmc, pc.genes = pbmc@var.genes, pcs.compute = 30, do.print = FALSE)
# pbmc@dr$pca
# Principle components (PCs) capture the variability in your dataset. Although we specified 30 PCs, we want to use only the PCs that capture variability and discard the rest for downstream analyses. You look for saturation (flatline) in the relationship between the number of principle components and the percentage of the variance explained.
# 3 ways to look at PCs...
# 1. Elbow plot of principal components
PCElbowPlot(object = pbmc, num.pc = 30)
# 2. Heatmap of individual PCs
PCHeatmap(object = pbmc, pc.use = 1:15, cells.use = 500, do.balanced = TRUE, label.column = FALSE, use.full = FALSE)
PCHeatmap(object = pbmc, pc.use = 16:30, cells.use = 500, do.balanced = TRUE, label.column = FALSE, use.full = FALSE)
# 3. Jackstraw package to determine statistically significant principal components
pbmc <- JackStraw(object = pbmc, num.pc = 30, num.replicate = 100, display.progress = TRUE)
|
| | 0%
|
|= | 1%
|
|== | 2%
|
|== | 3%
|
|=== | 4%
|
|==== | 5%
|
|===== | 6%
|
|====== | 7%
|
|====== | 8%
|
|======= | 9%
|
|======== | 10%
|
|========= | 11%
|
|========== | 12%
|
|========== | 13%
|
|=========== | 14%
|
|============ | 15%
|
|============= | 16%
|
|============== | 17%
|
|============== | 18%
|
|=============== | 19%
|
|================ | 20%
|
|================= | 21%
|
|================== | 22%
|
|================== | 23%
|
|=================== | 24%
|
|==================== | 25%
|
|===================== | 26%
|
|====================== | 27%
|
|====================== | 28%
|
|======================= | 29%
|
|======================== | 30%
|
|========================= | 31%
|
|========================== | 32%
|
|========================== | 33%
|
|=========================== | 34%
|
|============================ | 35%
|
|============================= | 36%
|
|============================== | 37%
|
|============================== | 38%
|
|=============================== | 39%
|
|================================ | 40%
|
|================================= | 41%
|
|================================== | 42%
|
|================================== | 43%
|
|=================================== | 44%
|
|==================================== | 45%
|
|===================================== | 46%
|
|====================================== | 47%
|
|====================================== | 48%
|
|======================================= | 49%
|
|======================================== | 50%
|
|========================================= | 51%
|
|========================================== | 52%
|
|========================================== | 53%
|
|=========================================== | 54%
|
|============================================ | 55%
|
|============================================= | 56%
|
|============================================== | 57%
|
|============================================== | 58%
|
|=============================================== | 59%
|
|================================================ | 60%
|
|================================================= | 61%
|
|================================================== | 62%
|
|================================================== | 63%
|
|=================================================== | 64%
|
|==================================================== | 65%
|
|===================================================== | 66%
|
|====================================================== | 67%
|
|====================================================== | 68%
|
|======================================================= | 69%
|
|======================================================== | 70%
|
|========================================================= | 71%
|
|========================================================== | 72%
|
|========================================================== | 73%
|
|=========================================================== | 74%
|
|============================================================ | 75%
|
|============================================================= | 76%
|
|============================================================== | 77%
|
|============================================================== | 78%
|
|=============================================================== | 79%
|
|================================================================ | 80%
|
|================================================================= | 81%
|
|================================================================== | 82%
|
|================================================================== | 83%
|
|=================================================================== | 84%
|
|==================================================================== | 85%
|
|===================================================================== | 86%
|
|====================================================================== | 87%
|
|====================================================================== | 88%
|
|======================================================================= | 89%
|
|======================================================================== | 90%
|
|========================================================================= | 91%
|
|========================================================================== | 92%
|
|========================================================================== | 93%
|
|=========================================================================== | 94%
|
|============================================================================ | 95%
|
|============================================================================= | 96%
|
|============================================================================== | 97%
|
|============================================================================== | 98%
|
|=============================================================================== | 99%
|
|================================================================================| 100%
Time Elapsed: 12.1679507493973 mins
JackStrawPlot(object = pbmc, PCs = 1:30)
An object of class seurat in project control_PBMC
13537 genes across 12927 samples.
# Clustering using Seurat's method. See more info in ?FindClusters.
# specify the number of PCs using dims.use
pbmc <- FindClusters(object = pbmc, reduction.type = "pca", dims.use = 1:20, resolution = 0.6,
print.output = 0, save.SNN = TRUE)
# pbmc@ident
# Run dimension reduction (t-SNE) to visualize the clustering
pbmc <- Seurat::RunTSNE(object = pbmc, dims.use = 1:20, do.fast = TRUE)
TSNEPlot(object = pbmc)
# cluster 1 vs all other clusters pooled together
cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 1, min.pct = 0.25)
| | 0 % ~calculating
|+ | 1 % ~02m 02s
|+ | 2 % ~02m 05s
|++ | 3 % ~02m 03s
|++ | 4 % ~02m 02s
|+++ | 5 % ~01m 59s
|+++ | 6 % ~01m 57s
|++++ | 7 % ~01m 56s
|++++ | 8 % ~01m 57s
|+++++ | 9 % ~01m 55s
|+++++ | 10% ~01m 53s
|++++++ | 11% ~01m 52s
|++++++ | 12% ~01m 53s
|+++++++ | 13% ~01m 51s
|+++++++ | 14% ~01m 50s
|++++++++ | 15% ~01m 49s
|++++++++ | 16% ~01m 48s
|+++++++++ | 17% ~01m 48s
|+++++++++ | 18% ~01m 50s
|++++++++++ | 19% ~01m 48s
|++++++++++ | 20% ~01m 47s
|+++++++++++ | 21% ~01m 45s
|+++++++++++ | 22% ~01m 46s
|++++++++++++ | 23% ~01m 44s
|++++++++++++ | 24% ~01m 43s
|+++++++++++++ | 25% ~01m 42s
|+++++++++++++ | 26% ~01m 41s
|++++++++++++++ | 27% ~01m 40s
|++++++++++++++ | 28% ~01m 38s
|+++++++++++++++ | 29% ~01m 36s
|+++++++++++++++ | 30% ~01m 36s
|++++++++++++++++ | 31% ~01m 34s
|++++++++++++++++ | 32% ~01m 35s
|+++++++++++++++++ | 33% ~01m 33s
|+++++++++++++++++ | 34% ~01m 31s
|++++++++++++++++++ | 35% ~01m 29s
|++++++++++++++++++ | 36% ~01m 28s
|+++++++++++++++++++ | 37% ~01m 26s
|+++++++++++++++++++ | 38% ~01m 25s
|++++++++++++++++++++ | 39% ~01m 23s
|++++++++++++++++++++ | 40% ~01m 22s
|+++++++++++++++++++++ | 41% ~01m 20s
|+++++++++++++++++++++ | 42% ~01m 19s
|++++++++++++++++++++++ | 43% ~01m 18s
|++++++++++++++++++++++ | 44% ~01m 16s
|+++++++++++++++++++++++ | 45% ~01m 15s
|+++++++++++++++++++++++ | 46% ~01m 13s
|++++++++++++++++++++++++ | 47% ~01m 12s
|++++++++++++++++++++++++ | 48% ~01m 11s
|+++++++++++++++++++++++++ | 49% ~01m 09s
|+++++++++++++++++++++++++ | 50% ~01m 08s
|++++++++++++++++++++++++++ | 51% ~01m 06s
|++++++++++++++++++++++++++ | 52% ~01m 05s
|+++++++++++++++++++++++++++ | 53% ~01m 03s
|+++++++++++++++++++++++++++ | 54% ~01m 02s
|++++++++++++++++++++++++++++ | 55% ~01m 01s
|++++++++++++++++++++++++++++ | 56% ~59s
|+++++++++++++++++++++++++++++ | 57% ~58s
|+++++++++++++++++++++++++++++ | 58% ~56s
|++++++++++++++++++++++++++++++ | 59% ~55s
|++++++++++++++++++++++++++++++ | 60% ~54s
|+++++++++++++++++++++++++++++++ | 61% ~52s
|+++++++++++++++++++++++++++++++ | 62% ~51s
|++++++++++++++++++++++++++++++++ | 63% ~49s
|++++++++++++++++++++++++++++++++ | 64% ~49s
|+++++++++++++++++++++++++++++++++ | 65% ~47s
|+++++++++++++++++++++++++++++++++ | 66% ~46s
|++++++++++++++++++++++++++++++++++ | 67% ~44s
|++++++++++++++++++++++++++++++++++ | 68% ~43s
|+++++++++++++++++++++++++++++++++++ | 69% ~42s
|+++++++++++++++++++++++++++++++++++ | 70% ~40s
|++++++++++++++++++++++++++++++++++++ | 71% ~39s
|++++++++++++++++++++++++++++++++++++ | 72% ~38s
|+++++++++++++++++++++++++++++++++++++ | 73% ~36s
|+++++++++++++++++++++++++++++++++++++ | 74% ~35s
|++++++++++++++++++++++++++++++++++++++ | 75% ~33s
|++++++++++++++++++++++++++++++++++++++ | 76% ~32s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~31s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~29s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~28s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~27s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~25s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~24s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~23s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~21s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~20s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~19s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~17s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~16s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~15s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~13s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~12s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~09s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 13s
print(x = head(x = cluster1.markers, n =5))
p_val avg_logFC pct.1 pct.2 p_val_adj
S100A8 0 2.965944 0.852 0.050 0
CCL2 0 2.926204 0.468 0.038 0
IL8 0 2.769285 0.880 0.091 0
S100A9 0 2.730468 0.762 0.043 0
FTL 0 2.405877 1.000 0.872 0
# cluster 1 vs cluster 5
cluster1.markers.5 <- FindMarkers(object = pbmc, ident.1 = 1, ident.2 = 5, min.pct = 0.25)
| | 0 % ~calculating
|+ | 1 % ~18s
|++ | 2 % ~17s
|++ | 3 % ~17s
|+++ | 5 % ~17s
|+++ | 6 % ~16s
|++++ | 7 % ~16s
|+++++ | 8 % ~16s
|+++++ | 9 % ~15s
|++++++ | 10% ~15s
|++++++ | 11% ~15s
|+++++++ | 13% ~14s
|+++++++ | 14% ~14s
|++++++++ | 15% ~14s
|+++++++++ | 16% ~14s
|+++++++++ | 17% ~13s
|++++++++++ | 18% ~13s
|++++++++++ | 20% ~13s
|+++++++++++ | 21% ~13s
|+++++++++++ | 22% ~12s
|++++++++++++ | 23% ~12s
|+++++++++++++ | 24% ~12s
|+++++++++++++ | 25% ~12s
|++++++++++++++ | 26% ~12s
|++++++++++++++ | 28% ~11s
|+++++++++++++++ | 29% ~11s
|+++++++++++++++ | 30% ~11s
|++++++++++++++++ | 31% ~11s
|+++++++++++++++++ | 32% ~11s
|+++++++++++++++++ | 33% ~11s
|++++++++++++++++++ | 34% ~11s
|++++++++++++++++++ | 36% ~11s
|+++++++++++++++++++ | 37% ~11s
|+++++++++++++++++++ | 38% ~11s
|++++++++++++++++++++ | 39% ~11s
|+++++++++++++++++++++ | 40% ~10s
|+++++++++++++++++++++ | 41% ~10s
|++++++++++++++++++++++ | 43% ~10s
|++++++++++++++++++++++ | 44% ~10s
|+++++++++++++++++++++++ | 45% ~10s
|+++++++++++++++++++++++ | 46% ~09s
|++++++++++++++++++++++++ | 47% ~09s
|+++++++++++++++++++++++++ | 48% ~09s
|+++++++++++++++++++++++++ | 49% ~09s
|++++++++++++++++++++++++++ | 51% ~09s
|++++++++++++++++++++++++++ | 52% ~08s
|+++++++++++++++++++++++++++ | 53% ~08s
|++++++++++++++++++++++++++++ | 54% ~08s
|++++++++++++++++++++++++++++ | 55% ~08s
|+++++++++++++++++++++++++++++ | 56% ~08s
|+++++++++++++++++++++++++++++ | 57% ~07s
|++++++++++++++++++++++++++++++ | 59% ~07s
|++++++++++++++++++++++++++++++ | 60% ~07s
|+++++++++++++++++++++++++++++++ | 61% ~07s
|++++++++++++++++++++++++++++++++ | 62% ~07s
|++++++++++++++++++++++++++++++++ | 63% ~06s
|+++++++++++++++++++++++++++++++++ | 64% ~06s
|+++++++++++++++++++++++++++++++++ | 66% ~06s
|++++++++++++++++++++++++++++++++++ | 67% ~06s
|++++++++++++++++++++++++++++++++++ | 68% ~06s
|+++++++++++++++++++++++++++++++++++ | 69% ~05s
|++++++++++++++++++++++++++++++++++++ | 70% ~05s
|++++++++++++++++++++++++++++++++++++ | 71% ~05s
|+++++++++++++++++++++++++++++++++++++ | 72% ~05s
|+++++++++++++++++++++++++++++++++++++ | 74% ~05s
|++++++++++++++++++++++++++++++++++++++ | 75% ~04s
|++++++++++++++++++++++++++++++++++++++ | 76% ~04s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~04s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~04s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~03s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~03s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~03s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~03s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~02s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 18s
print(x = head(x = cluster1.markers.5, n =5))
p_val avg_logFC pct.1 pct.2 p_val_adj
VMO1 1.981317e-239 -2.590454 0.100 0.620 2.682109e-235
TNFSF10 4.458680e-222 -1.693412 0.023 0.434 6.035714e-218
FCGR3A 7.791344e-195 -1.641433 0.408 0.841 1.054714e-190
TNFSF13B 2.400820e-180 -1.271797 0.051 0.459 3.249990e-176
FAM26F 4.024863e-177 -1.594279 0.066 0.482 5.448457e-173
# Find markers for every cluster compared to all remaining cells, report only positive ones
pbmc.markers <- FindAllMarkers(object = pbmc, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)
| | 0 % ~calculating
|+ | 1 % ~02m 41s
|++ | 2 % ~02m 09s
|++ | 4 % ~01m 54s
|+++ | 5 % ~01m 45s
|+++ | 6 % ~01m 41s
|++++ | 7 % ~01m 37s
|+++++ | 8 % ~01m 39s
|+++++ | 9 % ~02m 08s
|++++++ | 11% ~02m 00s
|++++++ | 12% ~01m 53s
|+++++++ | 13% ~01m 47s
|++++++++ | 14% ~01m 42s
|++++++++ | 15% ~01m 38s
|+++++++++ | 16% ~01m 36s
|+++++++++ | 18% ~01m 33s
|++++++++++ | 19% ~01m 31s
|++++++++++ | 20% ~01m 28s
|+++++++++++ | 21% ~01m 26s
|++++++++++++ | 22% ~01m 24s
|++++++++++++ | 24% ~01m 22s
|+++++++++++++ | 25% ~01m 20s
|+++++++++++++ | 26% ~01m 18s
|++++++++++++++ | 27% ~01m 16s
|+++++++++++++++ | 28% ~01m 14s
|+++++++++++++++ | 29% ~01m 13s
|++++++++++++++++ | 31% ~01m 11s
|++++++++++++++++ | 32% ~01m 10s
|+++++++++++++++++ | 33% ~01m 08s
|++++++++++++++++++ | 34% ~01m 06s
|++++++++++++++++++ | 35% ~01m 05s
|+++++++++++++++++++ | 36% ~01m 03s
|+++++++++++++++++++ | 38% ~01m 02s
|++++++++++++++++++++ | 39% ~01m 01s
|++++++++++++++++++++ | 40% ~59s
|+++++++++++++++++++++ | 41% ~58s
|++++++++++++++++++++++ | 42% ~57s
|++++++++++++++++++++++ | 44% ~55s
|+++++++++++++++++++++++ | 45% ~54s
|+++++++++++++++++++++++ | 46% ~53s
|++++++++++++++++++++++++ | 47% ~51s
|+++++++++++++++++++++++++ | 48% ~50s
|+++++++++++++++++++++++++ | 49% ~49s
|++++++++++++++++++++++++++ | 51% ~48s
|++++++++++++++++++++++++++ | 52% ~46s
|+++++++++++++++++++++++++++ | 53% ~45s
|++++++++++++++++++++++++++++ | 54% ~44s
|++++++++++++++++++++++++++++ | 55% ~43s
|+++++++++++++++++++++++++++++ | 56% ~42s
|+++++++++++++++++++++++++++++ | 58% ~40s
|++++++++++++++++++++++++++++++ | 59% ~39s
|++++++++++++++++++++++++++++++ | 60% ~39s
|+++++++++++++++++++++++++++++++ | 61% ~38s
|++++++++++++++++++++++++++++++++ | 62% ~36s
|++++++++++++++++++++++++++++++++ | 64% ~35s
|+++++++++++++++++++++++++++++++++ | 65% ~34s
|+++++++++++++++++++++++++++++++++ | 66% ~33s
|++++++++++++++++++++++++++++++++++ | 67% ~32s
|+++++++++++++++++++++++++++++++++++ | 68% ~31s
|+++++++++++++++++++++++++++++++++++ | 69% ~29s
|++++++++++++++++++++++++++++++++++++ | 71% ~28s
|++++++++++++++++++++++++++++++++++++ | 72% ~27s
|+++++++++++++++++++++++++++++++++++++ | 73% ~26s
|++++++++++++++++++++++++++++++++++++++ | 74% ~25s
|++++++++++++++++++++++++++++++++++++++ | 75% ~24s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~23s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~21s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~20s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~19s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~18s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~17s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~16s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~14s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~13s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~12s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~10s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~08s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 34s
| | 0 % ~calculating
|+ | 1 % ~02m 25s
|+ | 2 % ~02m 26s
|++ | 3 % ~02m 32s
|++ | 4 % ~02m 28s
|+++ | 5 % ~02m 23s
|+++ | 6 % ~02m 17s
|++++ | 7 % ~02m 13s
|++++ | 8 % ~02m 09s
|+++++ | 9 % ~02m 06s
|+++++ | 10% ~02m 04s
|++++++ | 11% ~02m 03s
|++++++ | 12% ~02m 02s
|+++++++ | 13% ~01m 59s
|+++++++ | 14% ~01m 60s
|++++++++ | 15% ~01m 58s
|++++++++ | 16% ~01m 57s
|+++++++++ | 17% ~02m 04s
|+++++++++ | 18% ~02m 01s
|++++++++++ | 19% ~01m 58s
|++++++++++ | 20% ~01m 56s
|+++++++++++ | 21% ~01m 54s
|+++++++++++ | 22% ~01m 52s
|++++++++++++ | 23% ~01m 50s
|++++++++++++ | 24% ~01m 49s
|+++++++++++++ | 25% ~01m 47s
|+++++++++++++ | 26% ~01m 45s
|++++++++++++++ | 27% ~01m 43s
|++++++++++++++ | 28% ~01m 41s
|+++++++++++++++ | 29% ~01m 39s
|+++++++++++++++ | 30% ~01m 37s
|++++++++++++++++ | 31% ~01m 36s
|++++++++++++++++ | 32% ~01m 34s
|+++++++++++++++++ | 33% ~01m 33s
|+++++++++++++++++ | 34% ~01m 31s
|++++++++++++++++++ | 35% ~01m 29s
|++++++++++++++++++ | 36% ~01m 28s
|+++++++++++++++++++ | 37% ~01m 26s
|+++++++++++++++++++ | 38% ~01m 25s
|++++++++++++++++++++ | 39% ~01m 23s
|++++++++++++++++++++ | 40% ~01m 22s
|+++++++++++++++++++++ | 41% ~01m 20s
|+++++++++++++++++++++ | 42% ~01m 19s
|++++++++++++++++++++++ | 43% ~01m 18s
|++++++++++++++++++++++ | 44% ~01m 16s
|+++++++++++++++++++++++ | 45% ~01m 16s
|+++++++++++++++++++++++ | 46% ~01m 15s
|++++++++++++++++++++++++ | 47% ~01m 13s
|++++++++++++++++++++++++ | 48% ~01m 12s
|+++++++++++++++++++++++++ | 49% ~01m 11s
|+++++++++++++++++++++++++ | 50% ~01m 09s
|++++++++++++++++++++++++++ | 51% ~01m 08s
|++++++++++++++++++++++++++ | 52% ~01m 06s
|+++++++++++++++++++++++++++ | 53% ~01m 04s
|+++++++++++++++++++++++++++ | 54% ~01m 03s
|++++++++++++++++++++++++++++ | 55% ~01m 02s
|++++++++++++++++++++++++++++ | 56% ~01m 00s
|+++++++++++++++++++++++++++++ | 57% ~59s
|+++++++++++++++++++++++++++++ | 58% ~57s
|++++++++++++++++++++++++++++++ | 59% ~56s
|++++++++++++++++++++++++++++++ | 60% ~55s
|+++++++++++++++++++++++++++++++ | 61% ~53s
|+++++++++++++++++++++++++++++++ | 62% ~52s
|++++++++++++++++++++++++++++++++ | 63% ~50s
|++++++++++++++++++++++++++++++++ | 64% ~49s
|+++++++++++++++++++++++++++++++++ | 65% ~48s
|+++++++++++++++++++++++++++++++++ | 66% ~47s
|++++++++++++++++++++++++++++++++++ | 67% ~45s
|++++++++++++++++++++++++++++++++++ | 68% ~44s
|+++++++++++++++++++++++++++++++++++ | 69% ~42s
|+++++++++++++++++++++++++++++++++++ | 70% ~41s
|++++++++++++++++++++++++++++++++++++ | 71% ~40s
|++++++++++++++++++++++++++++++++++++ | 72% ~39s
|+++++++++++++++++++++++++++++++++++++ | 73% ~37s
|+++++++++++++++++++++++++++++++++++++ | 74% ~36s
|++++++++++++++++++++++++++++++++++++++ | 75% ~34s
|++++++++++++++++++++++++++++++++++++++ | 76% ~33s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~32s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~30s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~29s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~27s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~26s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~25s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~23s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~22s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~21s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~19s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~18s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~16s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~15s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~14s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~12s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 18s
| | 0 % ~calculating
|+ | 1 % ~52s
|++ | 2 % ~45s
|++ | 4 % ~48s
|+++ | 5 % ~47s
|++++ | 6 % ~45s
|++++ | 7 % ~44s
|+++++ | 9 % ~43s
|+++++ | 10% ~43s
|++++++ | 11% ~42s
|+++++++ | 12% ~41s
|+++++++ | 14% ~40s
|++++++++ | 15% ~39s
|+++++++++ | 16% ~38s
|+++++++++ | 17% ~37s
|++++++++++ | 19% ~36s
|++++++++++ | 20% ~36s
|+++++++++++ | 21% ~35s
|++++++++++++ | 22% ~36s
|++++++++++++ | 23% ~35s
|+++++++++++++ | 25% ~35s
|+++++++++++++ | 26% ~37s
|++++++++++++++ | 27% ~36s
|+++++++++++++++ | 28% ~35s
|+++++++++++++++ | 30% ~34s
|++++++++++++++++ | 31% ~33s
|+++++++++++++++++ | 32% ~33s
|+++++++++++++++++ | 33% ~32s
|++++++++++++++++++ | 35% ~31s
|++++++++++++++++++ | 36% ~31s
|+++++++++++++++++++ | 37% ~30s
|++++++++++++++++++++ | 38% ~29s
|++++++++++++++++++++ | 40% ~28s
|+++++++++++++++++++++ | 41% ~28s
|+++++++++++++++++++++ | 42% ~27s
|++++++++++++++++++++++ | 43% ~27s
|+++++++++++++++++++++++ | 44% ~26s
|+++++++++++++++++++++++ | 46% ~25s
|++++++++++++++++++++++++ | 47% ~25s
|+++++++++++++++++++++++++ | 48% ~24s
|+++++++++++++++++++++++++ | 49% ~24s
|++++++++++++++++++++++++++ | 51% ~23s
|++++++++++++++++++++++++++ | 52% ~22s
|+++++++++++++++++++++++++++ | 53% ~22s
|++++++++++++++++++++++++++++ | 54% ~21s
|++++++++++++++++++++++++++++ | 56% ~20s
|+++++++++++++++++++++++++++++ | 57% ~20s
|++++++++++++++++++++++++++++++ | 58% ~19s
|++++++++++++++++++++++++++++++ | 59% ~19s
|+++++++++++++++++++++++++++++++ | 60% ~18s
|+++++++++++++++++++++++++++++++ | 62% ~18s
|++++++++++++++++++++++++++++++++ | 63% ~17s
|+++++++++++++++++++++++++++++++++ | 64% ~16s
|+++++++++++++++++++++++++++++++++ | 65% ~16s
|++++++++++++++++++++++++++++++++++ | 67% ~15s
|++++++++++++++++++++++++++++++++++ | 68% ~15s
|+++++++++++++++++++++++++++++++++++ | 69% ~14s
|++++++++++++++++++++++++++++++++++++ | 70% ~13s
|++++++++++++++++++++++++++++++++++++ | 72% ~13s
|+++++++++++++++++++++++++++++++++++++ | 73% ~12s
|++++++++++++++++++++++++++++++++++++++ | 74% ~12s
|++++++++++++++++++++++++++++++++++++++ | 75% ~12s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~11s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~10s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~10s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~09s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~09s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~08s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~07s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~07s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~06s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 46s
| | 0 % ~calculating
|+ | 1 % ~01m 33s
|++ | 3 % ~01m 15s
|+++ | 4 % ~01m 06s
|+++ | 6 % ~01m 02s
|++++ | 7 % ~59s
|+++++ | 8 % ~56s
|+++++ | 10% ~55s
|++++++ | 11% ~53s
|+++++++ | 12% ~52s
|+++++++ | 14% ~50s
|++++++++ | 15% ~49s
|+++++++++ | 17% ~48s
|++++++++++ | 18% ~47s
|++++++++++ | 19% ~47s
|+++++++++++ | 21% ~46s
|++++++++++++ | 22% ~46s
|++++++++++++ | 24% ~45s
|+++++++++++++ | 25% ~47s
|++++++++++++++ | 26% ~49s
|++++++++++++++ | 28% ~48s
|+++++++++++++++ | 29% ~47s
|++++++++++++++++ | 31% ~46s
|++++++++++++++++ | 32% ~46s
|+++++++++++++++++ | 33% ~47s
|++++++++++++++++++ | 35% ~45s
|+++++++++++++++++++ | 36% ~43s
|+++++++++++++++++++ | 38% ~42s
|++++++++++++++++++++ | 39% ~41s
|+++++++++++++++++++++ | 40% ~39s
|+++++++++++++++++++++ | 42% ~38s
|++++++++++++++++++++++ | 43% ~37s
|+++++++++++++++++++++++ | 44% ~36s
|+++++++++++++++++++++++ | 46% ~35s
|++++++++++++++++++++++++ | 47% ~34s
|+++++++++++++++++++++++++ | 49% ~33s
|+++++++++++++++++++++++++ | 50% ~32s
|++++++++++++++++++++++++++ | 51% ~31s
|+++++++++++++++++++++++++++ | 53% ~30s
|++++++++++++++++++++++++++++ | 54% ~29s
|++++++++++++++++++++++++++++ | 56% ~29s
|+++++++++++++++++++++++++++++ | 57% ~28s
|++++++++++++++++++++++++++++++ | 58% ~27s
|++++++++++++++++++++++++++++++ | 60% ~26s
|+++++++++++++++++++++++++++++++ | 61% ~25s
|++++++++++++++++++++++++++++++++ | 62% ~24s
|++++++++++++++++++++++++++++++++ | 64% ~23s
|+++++++++++++++++++++++++++++++++ | 65% ~22s
|++++++++++++++++++++++++++++++++++ | 67% ~21s
|+++++++++++++++++++++++++++++++++++ | 68% ~20s
|+++++++++++++++++++++++++++++++++++ | 69% ~19s
|++++++++++++++++++++++++++++++++++++ | 71% ~18s
|+++++++++++++++++++++++++++++++++++++ | 72% ~17s
|+++++++++++++++++++++++++++++++++++++ | 74% ~17s
|++++++++++++++++++++++++++++++++++++++ | 75% ~16s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~15s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~14s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~13s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~12s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~11s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~11s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~10s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~09s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~08s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~06s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~04s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~04s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 05s
| | 0 % ~calculating
|+ | 1 % ~01m 52s
|++ | 2 % ~01m 41s
|++ | 4 % ~01m 51s
|+++ | 5 % ~01m 44s
|+++ | 6 % ~01m 37s
|++++ | 7 % ~01m 45s
|+++++ | 8 % ~01m 36s
|+++++ | 10% ~01m 29s
|++++++ | 11% ~01m 24s
|++++++ | 12% ~01m 19s
|+++++++ | 13% ~01m 15s
|++++++++ | 14% ~01m 13s
|++++++++ | 15% ~01m 11s
|+++++++++ | 17% ~01m 10s
|+++++++++ | 18% ~01m 10s
|++++++++++ | 19% ~01m 08s
|+++++++++++ | 20% ~01m 07s
|+++++++++++ | 21% ~01m 06s
|++++++++++++ | 23% ~01m 05s
|++++++++++++ | 24% ~01m 03s
|+++++++++++++ | 25% ~01m 02s
|++++++++++++++ | 26% ~01m 02s
|++++++++++++++ | 27% ~01m 00s
|+++++++++++++++ | 29% ~59s
|+++++++++++++++ | 30% ~58s
|++++++++++++++++ | 31% ~57s
|+++++++++++++++++ | 32% ~56s
|+++++++++++++++++ | 33% ~55s
|++++++++++++++++++ | 35% ~53s
|++++++++++++++++++ | 36% ~54s
|+++++++++++++++++++ | 37% ~52s
|++++++++++++++++++++ | 38% ~51s
|++++++++++++++++++++ | 39% ~50s
|+++++++++++++++++++++ | 40% ~49s
|+++++++++++++++++++++ | 42% ~47s
|++++++++++++++++++++++ | 43% ~46s
|+++++++++++++++++++++++ | 44% ~45s
|+++++++++++++++++++++++ | 45% ~44s
|++++++++++++++++++++++++ | 46% ~43s
|++++++++++++++++++++++++ | 48% ~41s
|+++++++++++++++++++++++++ | 49% ~40s
|+++++++++++++++++++++++++ | 50% ~39s
|++++++++++++++++++++++++++ | 51% ~38s
|+++++++++++++++++++++++++++ | 52% ~37s
|+++++++++++++++++++++++++++ | 54% ~37s
|++++++++++++++++++++++++++++ | 55% ~36s
|++++++++++++++++++++++++++++ | 56% ~39s
|+++++++++++++++++++++++++++++ | 57% ~38s
|++++++++++++++++++++++++++++++ | 58% ~36s
|++++++++++++++++++++++++++++++ | 60% ~35s
|+++++++++++++++++++++++++++++++ | 61% ~34s
|+++++++++++++++++++++++++++++++ | 62% ~33s
|++++++++++++++++++++++++++++++++ | 63% ~32s
|+++++++++++++++++++++++++++++++++ | 64% ~31s
|+++++++++++++++++++++++++++++++++ | 65% ~29s
|++++++++++++++++++++++++++++++++++ | 67% ~28s
|++++++++++++++++++++++++++++++++++ | 68% ~27s
|+++++++++++++++++++++++++++++++++++ | 69% ~26s
|++++++++++++++++++++++++++++++++++++ | 70% ~25s
|++++++++++++++++++++++++++++++++++++ | 71% ~24s
|+++++++++++++++++++++++++++++++++++++ | 73% ~23s
|+++++++++++++++++++++++++++++++++++++ | 74% ~22s
|++++++++++++++++++++++++++++++++++++++ | 75% ~21s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~20s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~19s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~18s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~17s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~16s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~15s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~14s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~13s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~12s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~07s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~06s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 20s
| | 0 % ~calculating
|+ | 1 % ~04m 29s
|++ | 2 % ~03m 31s
|++ | 3 % ~03m 03s
|+++ | 4 % ~02m 51s
|+++ | 5 % ~02m 43s
|++++ | 6 % ~02m 34s
|++++ | 7 % ~02m 28s
|+++++ | 8 % ~02m 26s
|+++++ | 9 % ~03m 00s
|++++++ | 10% ~02m 51s
|++++++ | 11% ~02m 42s
|+++++++ | 12% ~02m 36s
|+++++++ | 13% ~02m 30s
|++++++++ | 14% ~02m 26s
|++++++++ | 15% ~02m 22s
|+++++++++ | 16% ~02m 21s
|+++++++++ | 17% ~02m 17s
|++++++++++ | 18% ~02m 14s
|++++++++++ | 19% ~02m 11s
|+++++++++++ | 20% ~02m 08s
|+++++++++++ | 21% ~02m 05s
|++++++++++++ | 22% ~02m 03s
|++++++++++++ | 23% ~02m 01s
|+++++++++++++ | 24% ~01m 59s
|+++++++++++++ | 25% ~01m 56s
|++++++++++++++ | 26% ~01m 54s
|++++++++++++++ | 27% ~01m 52s
|+++++++++++++++ | 28% ~01m 50s
|+++++++++++++++ | 29% ~01m 47s
|++++++++++++++++ | 30% ~01m 45s
|++++++++++++++++ | 31% ~01m 43s
|+++++++++++++++++ | 32% ~01m 42s
|+++++++++++++++++ | 33% ~01m 40s
|++++++++++++++++++ | 34% ~01m 39s
|++++++++++++++++++ | 35% ~01m 37s
|+++++++++++++++++++ | 36% ~01m 36s
|+++++++++++++++++++ | 37% ~01m 35s
|++++++++++++++++++++ | 38% ~01m 33s
|++++++++++++++++++++ | 39% ~01m 31s
|+++++++++++++++++++++ | 40% ~01m 30s
|+++++++++++++++++++++ | 41% ~01m 29s
|++++++++++++++++++++++ | 42% ~01m 27s
|++++++++++++++++++++++ | 43% ~01m 25s
|+++++++++++++++++++++++ | 44% ~01m 23s
|+++++++++++++++++++++++ | 45% ~01m 21s
|++++++++++++++++++++++++ | 46% ~01m 20s
|++++++++++++++++++++++++ | 47% ~01m 18s
|+++++++++++++++++++++++++ | 48% ~01m 16s
|+++++++++++++++++++++++++ | 49% ~01m 14s
|++++++++++++++++++++++++++ | 51% ~01m 13s
|++++++++++++++++++++++++++ | 52% ~01m 11s
|+++++++++++++++++++++++++++ | 53% ~01m 09s
|+++++++++++++++++++++++++++ | 54% ~01m 08s
|++++++++++++++++++++++++++++ | 55% ~01m 06s
|++++++++++++++++++++++++++++ | 56% ~01m 04s
|+++++++++++++++++++++++++++++ | 57% ~01m 03s
|+++++++++++++++++++++++++++++ | 58% ~01m 01s
|++++++++++++++++++++++++++++++ | 59% ~60s
|++++++++++++++++++++++++++++++ | 60% ~58s
|+++++++++++++++++++++++++++++++ | 61% ~57s
|+++++++++++++++++++++++++++++++ | 62% ~56s
|++++++++++++++++++++++++++++++++ | 63% ~54s
|++++++++++++++++++++++++++++++++ | 64% ~53s
|+++++++++++++++++++++++++++++++++ | 65% ~51s
|+++++++++++++++++++++++++++++++++ | 66% ~50s
|++++++++++++++++++++++++++++++++++ | 67% ~48s
|++++++++++++++++++++++++++++++++++ | 68% ~47s
|+++++++++++++++++++++++++++++++++++ | 69% ~45s
|+++++++++++++++++++++++++++++++++++ | 70% ~44s
|++++++++++++++++++++++++++++++++++++ | 71% ~42s
|++++++++++++++++++++++++++++++++++++ | 72% ~41s
|+++++++++++++++++++++++++++++++++++++ | 73% ~39s
|+++++++++++++++++++++++++++++++++++++ | 74% ~38s
|++++++++++++++++++++++++++++++++++++++ | 75% ~37s
|++++++++++++++++++++++++++++++++++++++ | 76% ~35s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~34s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~32s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~31s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~29s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~28s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~26s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~25s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~23s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~22s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~20s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~19s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~18s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~16s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~15s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~13s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~12s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~07s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 25s
| | 0 % ~calculating
|+ | 1 % ~02m 05s
|++ | 2 % ~01m 59s
|++ | 3 % ~01m 57s
|+++ | 4 % ~01m 56s
|+++ | 5 % ~01m 57s
|++++ | 6 % ~01m 55s
|++++ | 7 % ~01m 56s
|+++++ | 9 % ~01m 53s
|+++++ | 10% ~01m 56s
|++++++ | 11% ~01m 56s
|++++++ | 12% ~01m 56s
|+++++++ | 13% ~01m 55s
|+++++++ | 14% ~01m 58s
|++++++++ | 15% ~01m 57s
|++++++++ | 16% ~01m 56s
|+++++++++ | 17% ~01m 54s
|++++++++++ | 18% ~01m 52s
|++++++++++ | 19% ~01m 52s
|+++++++++++ | 20% ~01m 51s
|+++++++++++ | 21% ~01m 49s
|++++++++++++ | 22% ~01m 47s
|++++++++++++ | 23% ~01m 45s
|+++++++++++++ | 24% ~01m 43s
|+++++++++++++ | 26% ~01m 41s
|++++++++++++++ | 27% ~01m 39s
|++++++++++++++ | 28% ~01m 40s
|+++++++++++++++ | 29% ~01m 38s
|+++++++++++++++ | 30% ~01m 36s
|++++++++++++++++ | 31% ~01m 34s
|++++++++++++++++ | 32% ~01m 35s
|+++++++++++++++++ | 33% ~01m 34s
|++++++++++++++++++ | 34% ~01m 32s
|++++++++++++++++++ | 35% ~01m 30s
|+++++++++++++++++++ | 36% ~01m 29s
|+++++++++++++++++++ | 37% ~01m 27s
|++++++++++++++++++++ | 38% ~01m 25s
|++++++++++++++++++++ | 39% ~01m 23s
|+++++++++++++++++++++ | 40% ~01m 22s
|+++++++++++++++++++++ | 41% ~01m 21s
|++++++++++++++++++++++ | 43% ~01m 19s
|++++++++++++++++++++++ | 44% ~01m 18s
|+++++++++++++++++++++++ | 45% ~01m 17s
|+++++++++++++++++++++++ | 46% ~01m 17s
|++++++++++++++++++++++++ | 47% ~01m 15s
|++++++++++++++++++++++++ | 48% ~01m 14s
|+++++++++++++++++++++++++ | 49% ~01m 12s
|+++++++++++++++++++++++++ | 50% ~01m 11s
|++++++++++++++++++++++++++ | 51% ~01m 09s
|+++++++++++++++++++++++++++ | 52% ~01m 08s
|+++++++++++++++++++++++++++ | 53% ~01m 06s
|++++++++++++++++++++++++++++ | 54% ~01m 04s
|++++++++++++++++++++++++++++ | 55% ~01m 03s
|+++++++++++++++++++++++++++++ | 56% ~01m 03s
|+++++++++++++++++++++++++++++ | 57% ~01m 01s
|++++++++++++++++++++++++++++++ | 59% ~59s
|++++++++++++++++++++++++++++++ | 60% ~58s
|+++++++++++++++++++++++++++++++ | 61% ~56s
|+++++++++++++++++++++++++++++++ | 62% ~56s
|++++++++++++++++++++++++++++++++ | 63% ~54s
|++++++++++++++++++++++++++++++++ | 64% ~53s
|+++++++++++++++++++++++++++++++++ | 65% ~51s
|+++++++++++++++++++++++++++++++++ | 66% ~50s
|++++++++++++++++++++++++++++++++++ | 67% ~48s
|+++++++++++++++++++++++++++++++++++ | 68% ~47s
|+++++++++++++++++++++++++++++++++++ | 69% ~45s
|++++++++++++++++++++++++++++++++++++ | 70% ~46s
|++++++++++++++++++++++++++++++++++++ | 71% ~44s
|+++++++++++++++++++++++++++++++++++++ | 72% ~42s
|+++++++++++++++++++++++++++++++++++++ | 73% ~40s
|++++++++++++++++++++++++++++++++++++++ | 74% ~39s
|++++++++++++++++++++++++++++++++++++++ | 76% ~37s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~35s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~34s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~32s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~30s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~29s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~27s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~25s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~24s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~22s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~21s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~19s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~17s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~16s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~14s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~13s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 25s
| | 0 % ~calculating
|+ | 1 % ~43s
|++ | 3 % ~34s
|++ | 4 % ~31s
|+++ | 5 % ~29s
|++++ | 6 % ~28s
|++++ | 8 % ~31s
|+++++ | 9 % ~32s
|++++++ | 10% ~30s
|++++++ | 12% ~29s
|+++++++ | 13% ~28s
|++++++++ | 14% ~26s
|++++++++ | 16% ~25s
|+++++++++ | 17% ~24s
|++++++++++ | 18% ~23s
|++++++++++ | 19% ~23s
|+++++++++++ | 21% ~22s
|++++++++++++ | 22% ~22s
|++++++++++++ | 23% ~21s
|+++++++++++++ | 25% ~20s
|+++++++++++++ | 26% ~20s
|++++++++++++++ | 27% ~19s
|+++++++++++++++ | 29% ~19s
|+++++++++++++++ | 30% ~18s
|++++++++++++++++ | 31% ~18s
|+++++++++++++++++ | 32% ~18s
|+++++++++++++++++ | 34% ~17s
|++++++++++++++++++ | 35% ~19s
|+++++++++++++++++++ | 36% ~18s
|+++++++++++++++++++ | 38% ~18s
|++++++++++++++++++++ | 39% ~17s
|+++++++++++++++++++++ | 40% ~17s
|+++++++++++++++++++++ | 42% ~17s
|++++++++++++++++++++++ | 43% ~16s
|+++++++++++++++++++++++ | 44% ~16s
|+++++++++++++++++++++++ | 45% ~16s
|++++++++++++++++++++++++ | 47% ~15s
|+++++++++++++++++++++++++ | 48% ~15s
|+++++++++++++++++++++++++ | 49% ~14s
|++++++++++++++++++++++++++ | 51% ~14s
|++++++++++++++++++++++++++ | 52% ~13s
|+++++++++++++++++++++++++++ | 53% ~13s
|++++++++++++++++++++++++++++ | 55% ~12s
|++++++++++++++++++++++++++++ | 56% ~12s
|+++++++++++++++++++++++++++++ | 57% ~11s
|++++++++++++++++++++++++++++++ | 58% ~11s
|++++++++++++++++++++++++++++++ | 60% ~11s
|+++++++++++++++++++++++++++++++ | 61% ~10s
|++++++++++++++++++++++++++++++++ | 62% ~10s
|++++++++++++++++++++++++++++++++ | 64% ~09s
|+++++++++++++++++++++++++++++++++ | 65% ~09s
|++++++++++++++++++++++++++++++++++ | 66% ~09s
|++++++++++++++++++++++++++++++++++ | 68% ~08s
|+++++++++++++++++++++++++++++++++++ | 69% ~08s
|++++++++++++++++++++++++++++++++++++ | 70% ~08s
|++++++++++++++++++++++++++++++++++++ | 71% ~07s
|+++++++++++++++++++++++++++++++++++++ | 73% ~07s
|++++++++++++++++++++++++++++++++++++++ | 74% ~07s
|++++++++++++++++++++++++++++++++++++++ | 75% ~06s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~06s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~06s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~05s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~05s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~05s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~04s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~04s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~04s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~03s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~02s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 25s
| | 0 % ~calculating
|+ | 1 % ~02m 04s
|++ | 2 % ~02m 00s
|++ | 3 % ~01m 57s
|+++ | 4 % ~01m 59s
|+++ | 5 % ~02m 19s
|++++ | 6 % ~02m 17s
|++++ | 7 % ~02m 15s
|+++++ | 8 % ~02m 14s
|+++++ | 9 % ~02m 11s
|++++++ | 10% ~02m 09s
|++++++ | 11% ~02m 07s
|+++++++ | 12% ~02m 04s
|+++++++ | 13% ~02m 02s
|++++++++ | 14% ~02m 02s
|++++++++ | 15% ~02m 02s
|+++++++++ | 16% ~01m 60s
|+++++++++ | 18% ~02m 03s
|++++++++++ | 19% ~02m 00s
|++++++++++ | 20% ~01m 58s
|+++++++++++ | 21% ~01m 56s
|+++++++++++ | 22% ~01m 53s
|++++++++++++ | 23% ~01m 52s
|++++++++++++ | 24% ~01m 50s
|+++++++++++++ | 25% ~01m 48s
|+++++++++++++ | 26% ~01m 47s
|++++++++++++++ | 27% ~01m 45s
|++++++++++++++ | 28% ~01m 44s
|+++++++++++++++ | 29% ~01m 45s
|+++++++++++++++ | 30% ~01m 43s
|++++++++++++++++ | 31% ~01m 41s
|++++++++++++++++ | 32% ~01m 40s
|+++++++++++++++++ | 33% ~01m 38s
|++++++++++++++++++ | 34% ~01m 37s
|++++++++++++++++++ | 35% ~01m 35s
|+++++++++++++++++++ | 36% ~01m 43s
|+++++++++++++++++++ | 37% ~01m 41s
|++++++++++++++++++++ | 38% ~01m 38s
|++++++++++++++++++++ | 39% ~01m 37s
|+++++++++++++++++++++ | 40% ~01m 35s
|+++++++++++++++++++++ | 41% ~01m 32s
|++++++++++++++++++++++ | 42% ~01m 30s
|++++++++++++++++++++++ | 43% ~01m 28s
|+++++++++++++++++++++++ | 44% ~01m 26s
|+++++++++++++++++++++++ | 45% ~01m 24s
|++++++++++++++++++++++++ | 46% ~01m 22s
|++++++++++++++++++++++++ | 47% ~01m 20s
|+++++++++++++++++++++++++ | 48% ~01m 18s
|+++++++++++++++++++++++++ | 49% ~01m 17s
|++++++++++++++++++++++++++ | 51% ~01m 15s
|++++++++++++++++++++++++++ | 52% ~01m 13s
|+++++++++++++++++++++++++++ | 53% ~01m 12s
|+++++++++++++++++++++++++++ | 54% ~01m 10s
|++++++++++++++++++++++++++++ | 55% ~01m 08s
|++++++++++++++++++++++++++++ | 56% ~01m 07s
|+++++++++++++++++++++++++++++ | 57% ~01m 05s
|+++++++++++++++++++++++++++++ | 58% ~01m 04s
|++++++++++++++++++++++++++++++ | 59% ~01m 02s
|++++++++++++++++++++++++++++++ | 60% ~01m 00s
|+++++++++++++++++++++++++++++++ | 61% ~59s
|+++++++++++++++++++++++++++++++ | 62% ~57s
|++++++++++++++++++++++++++++++++ | 63% ~56s
|++++++++++++++++++++++++++++++++ | 64% ~54s
|+++++++++++++++++++++++++++++++++ | 65% ~52s
|+++++++++++++++++++++++++++++++++ | 66% ~51s
|++++++++++++++++++++++++++++++++++ | 67% ~49s
|+++++++++++++++++++++++++++++++++++ | 68% ~48s
|+++++++++++++++++++++++++++++++++++ | 69% ~47s
|++++++++++++++++++++++++++++++++++++ | 70% ~45s
|++++++++++++++++++++++++++++++++++++ | 71% ~43s
|+++++++++++++++++++++++++++++++++++++ | 72% ~42s
|+++++++++++++++++++++++++++++++++++++ | 73% ~40s
|++++++++++++++++++++++++++++++++++++++ | 74% ~38s
|++++++++++++++++++++++++++++++++++++++ | 75% ~37s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~35s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~34s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~32s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~31s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~29s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~27s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~26s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~25s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~23s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~21s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~20s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~18s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~17s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~15s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~14s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~12s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 28s
| | 0 % ~calculating
|+ | 1 % ~03m 02s
|++ | 2 % ~02m 57s
|++ | 3 % ~02m 50s
|+++ | 4 % ~02m 43s
|+++ | 5 % ~02m 44s
|++++ | 7 % ~02m 44s
|++++ | 8 % ~02m 42s
|+++++ | 9 % ~02m 40s
|+++++ | 10% ~02m 38s
|++++++ | 11% ~02m 35s
|++++++ | 12% ~02m 36s
|+++++++ | 13% ~02m 35s
|++++++++ | 14% ~02m 41s
|++++++++ | 15% ~02m 37s
|+++++++++ | 16% ~02m 33s
|+++++++++ | 17% ~02m 29s
|++++++++++ | 18% ~02m 25s
|++++++++++ | 20% ~02m 22s
|+++++++++++ | 21% ~02m 21s
|+++++++++++ | 22% ~02m 19s
|++++++++++++ | 23% ~02m 17s
|++++++++++++ | 24% ~02m 14s
|+++++++++++++ | 25% ~02m 14s
|++++++++++++++ | 26% ~02m 11s
|++++++++++++++ | 27% ~02m 09s
|+++++++++++++++ | 28% ~02m 07s
|+++++++++++++++ | 29% ~02m 05s
|++++++++++++++++ | 30% ~02m 04s
|++++++++++++++++ | 32% ~02m 01s
|+++++++++++++++++ | 33% ~01m 59s
|+++++++++++++++++ | 34% ~01m 57s
|++++++++++++++++++ | 35% ~01m 57s
|++++++++++++++++++ | 36% ~01m 55s
|+++++++++++++++++++ | 37% ~01m 53s
|++++++++++++++++++++ | 38% ~01m 51s
|++++++++++++++++++++ | 39% ~01m 49s
|+++++++++++++++++++++ | 40% ~01m 47s
|+++++++++++++++++++++ | 41% ~01m 45s
|++++++++++++++++++++++ | 42% ~01m 43s
|++++++++++++++++++++++ | 43% ~01m 40s
|+++++++++++++++++++++++ | 45% ~01m 38s
|+++++++++++++++++++++++ | 46% ~01m 36s
|++++++++++++++++++++++++ | 47% ~01m 34s
|++++++++++++++++++++++++ | 48% ~01m 32s
|+++++++++++++++++++++++++ | 49% ~01m 32s
|+++++++++++++++++++++++++ | 50% ~01m 29s
|++++++++++++++++++++++++++ | 51% ~01m 27s
|+++++++++++++++++++++++++++ | 52% ~01m 25s
|+++++++++++++++++++++++++++ | 53% ~01m 23s
|++++++++++++++++++++++++++++ | 54% ~01m 21s
|++++++++++++++++++++++++++++ | 55% ~01m 19s
|+++++++++++++++++++++++++++++ | 57% ~01m 17s
|+++++++++++++++++++++++++++++ | 58% ~01m 15s
|++++++++++++++++++++++++++++++ | 59% ~01m 13s
|++++++++++++++++++++++++++++++ | 60% ~01m 11s
|+++++++++++++++++++++++++++++++ | 61% ~01m 12s
|+++++++++++++++++++++++++++++++ | 62% ~01m 10s
|++++++++++++++++++++++++++++++++ | 63% ~01m 08s
|+++++++++++++++++++++++++++++++++ | 64% ~01m 05s
|+++++++++++++++++++++++++++++++++ | 65% ~01m 03s
|++++++++++++++++++++++++++++++++++ | 66% ~01m 01s
|++++++++++++++++++++++++++++++++++ | 67% ~59s
|+++++++++++++++++++++++++++++++++++ | 68% ~57s
|+++++++++++++++++++++++++++++++++++ | 70% ~55s
|++++++++++++++++++++++++++++++++++++ | 71% ~53s
|++++++++++++++++++++++++++++++++++++ | 72% ~51s
|+++++++++++++++++++++++++++++++++++++ | 73% ~49s
|+++++++++++++++++++++++++++++++++++++ | 74% ~47s
|++++++++++++++++++++++++++++++++++++++ | 75% ~45s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~43s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~41s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~39s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~37s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~35s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~33s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~31s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~29s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~27s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~25s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~23s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~21s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~19s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~17s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~15s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~14s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~12s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~10s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~08s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 56s
| | 0 % ~calculating
|+ | 1 % ~01m 46s
|++ | 2 % ~01m 45s
|++ | 3 % ~01m 53s
|+++ | 4 % ~01m 51s
|+++ | 5 % ~01m 49s
|++++ | 7 % ~01m 46s
|++++ | 8 % ~01m 48s
|+++++ | 9 % ~01m 46s
|+++++ | 10% ~01m 47s
|++++++ | 11% ~01m 47s
|+++++++ | 12% ~01m 45s
|+++++++ | 13% ~01m 45s
|++++++++ | 14% ~01m 43s
|++++++++ | 15% ~01m 41s
|+++++++++ | 16% ~01m 40s
|+++++++++ | 18% ~01m 40s
|++++++++++ | 19% ~01m 40s
|++++++++++ | 20% ~01m 39s
|+++++++++++ | 21% ~01m 38s
|+++++++++++ | 22% ~01m 40s
|++++++++++++ | 23% ~01m 39s
|+++++++++++++ | 24% ~01m 37s
|+++++++++++++ | 25% ~01m 36s
|++++++++++++++ | 26% ~01m 34s
|++++++++++++++ | 27% ~01m 32s
|+++++++++++++++ | 29% ~01m 30s
|+++++++++++++++ | 30% ~01m 29s
|++++++++++++++++ | 31% ~01m 28s
|++++++++++++++++ | 32% ~01m 27s
|+++++++++++++++++ | 33% ~01m 26s
|++++++++++++++++++ | 34% ~01m 24s
|++++++++++++++++++ | 35% ~01m 23s
|+++++++++++++++++++ | 36% ~01m 23s
|+++++++++++++++++++ | 37% ~01m 22s
|++++++++++++++++++++ | 38% ~01m 20s
|++++++++++++++++++++ | 40% ~01m 19s
|+++++++++++++++++++++ | 41% ~01m 17s
|+++++++++++++++++++++ | 42% ~01m 16s
|++++++++++++++++++++++ | 43% ~01m 14s
|++++++++++++++++++++++ | 44% ~01m 13s
|+++++++++++++++++++++++ | 45% ~01m 12s
|++++++++++++++++++++++++ | 46% ~01m 11s
|++++++++++++++++++++++++ | 47% ~01m 11s
|+++++++++++++++++++++++++ | 48% ~01m 09s
|+++++++++++++++++++++++++ | 49% ~01m 08s
|++++++++++++++++++++++++++ | 51% ~01m 06s
|++++++++++++++++++++++++++ | 52% ~01m 05s
|+++++++++++++++++++++++++++ | 53% ~01m 03s
|+++++++++++++++++++++++++++ | 54% ~01m 01s
|++++++++++++++++++++++++++++ | 55% ~60s
|+++++++++++++++++++++++++++++ | 56% ~58s
|+++++++++++++++++++++++++++++ | 57% ~57s
|++++++++++++++++++++++++++++++ | 58% ~56s
|++++++++++++++++++++++++++++++ | 59% ~54s
|+++++++++++++++++++++++++++++++ | 60% ~53s
|+++++++++++++++++++++++++++++++ | 62% ~51s
|++++++++++++++++++++++++++++++++ | 63% ~50s
|++++++++++++++++++++++++++++++++ | 64% ~49s
|+++++++++++++++++++++++++++++++++ | 65% ~48s
|+++++++++++++++++++++++++++++++++ | 66% ~46s
|++++++++++++++++++++++++++++++++++ | 67% ~45s
|+++++++++++++++++++++++++++++++++++ | 68% ~43s
|+++++++++++++++++++++++++++++++++++ | 69% ~42s
|++++++++++++++++++++++++++++++++++++ | 70% ~40s
|++++++++++++++++++++++++++++++++++++ | 71% ~39s
|+++++++++++++++++++++++++++++++++++++ | 73% ~37s
|+++++++++++++++++++++++++++++++++++++ | 74% ~36s
|++++++++++++++++++++++++++++++++++++++ | 75% ~35s
|++++++++++++++++++++++++++++++++++++++ | 76% ~33s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~32s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~30s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~29s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~27s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~26s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~24s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~23s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~22s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~20s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~19s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~17s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~15s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~14s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~12s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~11s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~09s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~08s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~06s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 18s
# What about using a different test? On your own time, trying adding the argument test.use = "roc" and see how different your results are.
# The list of DE genes is long and it would be too much information to visualize them all. So, let's plot the top 5 features (genes) for each cluster.
# call library dplyr to use some of its functions
library(dplyr)
package ‘dplyr’ was built under R version 3.5.1
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
# group by cluster using group_by function and show top 5 results using top_n function
pbmc.markers.grouped <- group_by(pbmc.markers, cluster)
pbmc.markers.grouped.top <- top_n(pbmc.markers.grouped, 5, avg_logFC)
# convert it to a matrix for downstream applications (trust me)
pbmc.markers.grouped.top <- as.matrix(pbmc.markers.grouped.top)
print(pbmc.markers.grouped.top)
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene
[1,] " 0.000000e+00" "1.360231" "0.688" "0.181" " 0.000000e+00" "0" "LTB"
[2,] " 0.000000e+00" "1.247725" "0.678" "0.224" " 0.000000e+00" "0" "LDHB"
[3,] " 0.000000e+00" "1.236988" "0.446" "0.104" " 0.000000e+00" "0" "SELL"
[4,] " 0.000000e+00" "1.151767" "0.962" "0.783" " 0.000000e+00" "0" "PABPC1"
[5,] " 0.000000e+00" "1.059882" "0.445" "0.125" " 0.000000e+00" "0" "IL7R"
[6,] " 0.000000e+00" "2.965944" "0.852" "0.050" " 0.000000e+00" "1" "S100A8"
[7,] " 0.000000e+00" "2.926204" "0.468" "0.038" " 0.000000e+00" "1" "CCL2"
[8,] " 0.000000e+00" "2.769285" "0.880" "0.091" " 0.000000e+00" "1" "IL8"
[9,] " 0.000000e+00" "2.730468" "0.762" "0.043" " 0.000000e+00" "1" "S100A9"
[10,] " 0.000000e+00" "2.405877" "1.000" "0.872" " 0.000000e+00" "1" "FTL"
[11,] " 0.000000e+00" "2.144159" "0.478" "0.032" " 0.000000e+00" "2" "GZMH"
[12,] " 0.000000e+00" "2.072391" "0.861" "0.126" " 0.000000e+00" "2" "CCL5"
[13,] " 0.000000e+00" "1.651099" "0.402" "0.038" " 0.000000e+00" "2" "CD8A"
[14,] " 0.000000e+00" "1.572040" "0.743" "0.107" " 0.000000e+00" "2" "NKG7"
[15,] " 0.000000e+00" "1.562925" "0.554" "0.082" " 0.000000e+00" "2" "GZMB"
[16,] " 0.000000e+00" "2.869341" "0.814" "0.020" " 0.000000e+00" "3" "CD79A"
[17,] " 0.000000e+00" "2.139385" "0.519" "0.009" " 0.000000e+00" "3" "MS4A1"
[18,] " 0.000000e+00" "2.132632" "0.998" "0.503" " 0.000000e+00" "3" "CD74"
[19,] " 0.000000e+00" "1.783456" "0.527" "0.077" " 0.000000e+00" "3" "CD83"
[20,] " 0.000000e+00" "1.776907" "0.401" "0.012" " 0.000000e+00" "3" "CD79B"
[21,] " 0.000000e+00" "3.521768" "0.945" "0.070" " 0.000000e+00" "4" "GNLY"
[22,] " 0.000000e+00" "2.607033" "0.950" "0.111" " 0.000000e+00" "4" "NKG7"
[23,] " 0.000000e+00" "2.490249" "0.845" "0.075" " 0.000000e+00" "4" "GZMB"
[24,] " 0.000000e+00" "2.446398" "0.569" "0.025" " 0.000000e+00" "4" "CLIC3"
[25,] " 0.000000e+00" "2.242966" "0.520" "0.042" " 0.000000e+00" "4" "FGFBP2"
[26,] " 0.000000e+00" "2.900754" "0.620" "0.036" " 0.000000e+00" "5" "VMO1"
[27,] " 0.000000e+00" "2.344538" "0.269" "0.006" " 0.000000e+00" "5" "CXCL10"
[28,] " 0.000000e+00" "2.296334" "0.841" "0.129" " 0.000000e+00" "5" "FCGR3A"
[29,] " 0.000000e+00" "2.146760" "0.824" "0.111" " 0.000000e+00" "5" "MS4A7"
[30,] " 0.000000e+00" "1.830722" "0.698" "0.067" " 0.000000e+00" "5" "IFITM3"
[31,] "2.858001e-294" "2.183459" "0.487" "0.067" "3.868876e-290" "6" "HSPH1"
[32,] "2.541939e-202" "2.142275" "0.677" "0.218" "3.441023e-198" "6" "CACYBP"
[33,] "8.179524e-148" "1.961616" "0.362" "0.070" "1.107262e-143" "6" "DNAJB1"
[34,] "2.725095e-146" "2.582634" "0.478" "0.134" "3.688962e-142" "6" "HSPB1"
[35,] " 2.001307e-90" "2.390347" "0.344" "0.098" " 2.709169e-86" "6" "HSPA1A"
[36,] " 0.000000e+00" "3.547369" "0.714" "0.032" " 0.000000e+00" "7" "PPBP"
[37,] " 0.000000e+00" "2.581009" "0.522" "0.007" " 0.000000e+00" "7" "PF4"
[38,] " 0.000000e+00" "2.513364" "0.528" "0.012" " 0.000000e+00" "7" "GNG11"
[39,] " 0.000000e+00" "2.213129" "0.457" "0.007" " 0.000000e+00" "7" "SDPR"
[40,] " 0.000000e+00" "1.827362" "0.298" "0.002" " 0.000000e+00" "7" "TUBB1"
[41,] " 0.000000e+00" "2.375324" "0.934" "0.118" " 0.000000e+00" "8" "HLA-DQA1"
[42,] "4.022389e-211" "2.344441" "0.985" "0.303" "5.445108e-207" "8" "HLA-DPA1"
[43,] "3.958257e-187" "2.249284" "0.996" "0.413" "5.358293e-183" "8" "HLA-DRA"
[44,] "4.185786e-176" "2.420208" "0.865" "0.219" "5.666298e-172" "8" "LYZ"
[45,] "2.606548e-143" "2.736058" "0.894" "0.262" "3.528484e-139" "8" "TXN"
[46,] " 0.000000e+00" "3.082401" "0.797" "0.015" " 0.000000e+00" "9" "MIR155HG"
[47,] " 0.000000e+00" "2.140877" "0.758" "0.025" " 0.000000e+00" "9" "NME1"
[48,] "9.557452e-207" "2.246809" "0.922" "0.126" "1.293792e-202" "9" "HLA-DQA1"
[49,] "2.175653e-183" "1.924433" "0.843" "0.110" "2.945181e-179" "9" "CD83"
[50,] "2.271334e-143" "2.287105" "0.673" "0.089" "3.074705e-139" "9" "MYC"
[51,] " 0.000000e+00" "6.778140" "1.000" "0.017" " 0.000000e+00" "10" "HBA2"
[52,] " 0.000000e+00" "6.221867" "1.000" "0.010" " 0.000000e+00" "10" "HBA1"
[53,] " 0.000000e+00" "2.675141" "0.780" "0.000" " 0.000000e+00" "10" "ALAS2"
[54,] "2.298284e-175" "2.029726" "0.780" "0.028" "3.111187e-171" "10" "SNCA"
[55,] "5.222162e-117" "7.546049" "1.000" "0.081" "7.069241e-113" "10" "HBB"
# First, isolate the top 5 DE genes for each cluster.
cluster_0 <- which(pbmc.markers.grouped.top[,"cluster"] == 0)
cluster_1 <- which(pbmc.markers.grouped.top[,"cluster"] == 1)
cluster_2 <- which(pbmc.markers.grouped.top[,"cluster"] == 2)
cluster_3 <- which(pbmc.markers.grouped.top[,"cluster"] == 3)
cluster_4 <- which(pbmc.markers.grouped.top[,"cluster"] == 4)
cluster_5 <- which(pbmc.markers.grouped.top[,"cluster"] == 5)
cluster_6 <- which(pbmc.markers.grouped.top[,"cluster"] == 6)
cluster_7 <- which(pbmc.markers.grouped.top[,"cluster"] == 7)
cluster_8 <- which(pbmc.markers.grouped.top[,"cluster"] == 8)
cluster_9 <- which(pbmc.markers.grouped.top[,"cluster"] == 9)
cluster_10 <- which(pbmc.markers.grouped.top[,"cluster"] == 10)
# 3 options for visualization...
# 1. Violin plots
# if you want to see the points, insert point.size.use = 0.01 into the argument list
# # specify cluster 0 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_0, "gene"],
point.size.use = 0)
# # specify cluster 1 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_1, "gene"],
point.size.use = 0)
# # specify cluster 2 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_2, "gene"],
point.size.use = 0)
# # specify cluster 3 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_3, "gene"],
point.size.use = 0)
# # specify cluster 4 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_4, "gene"],
point.size.use = 0)
# # specify cluster 5 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_5, "gene"],
point.size.use = 0)
# # specify cluster 6 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_6, "gene"],
point.size.use = 0)
# # specify cluster 7 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_7, "gene"],
point.size.use = 0)
# # specify cluster 8 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_8, "gene"],
point.size.use = 0)
# # specify cluster 9 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_9, "gene"],
point.size.use = 0)
# # specify cluster 10 here
VlnPlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_10, "gene"],
point.size.use = 0)
# 2. Feature plot
# You could change the reduction.use to do PCA or ICA instead of t-SNE, but since we know where our clusters were mapped in the context of t-SNE, this makes the most sense for us.
# Cluster 0
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_0, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 1
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_1, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 2
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_2, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 3
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_3, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 4
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_4, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 5
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_5, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 6
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_6, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 7
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_7, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 8
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_8, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 9
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_9, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# Cluster 10
FeaturePlot(object = pbmc, features.plot = pbmc.markers.grouped.top[cluster_10, "gene"], cols.use = c("grey", "blue"), reduction.use = "tsne")
# 3. Heatmap
# Heatmaps have enough room to show you the top 5 (or more!) genes for each cluster. Let's do the top 5, but if you have time, try changing the top features to 10 or more.
DoHeatmap(object = pbmc, genes.use = pbmc.markers.grouped.top[ , "gene"], slim.col.label = TRUE, remove.key = TRUE)
# save this object and come back to it later
saveRDS(pbmc, file = paste(directory, "/pbmc_only.rds", sep = ""))
save.image(paste(directory, “/section1.RData”, sep = ""))
# load in the data - how many cells and how many genes? use dim(stim.data) to find out
stim.data <- read.table(paste(directory, "/immune_stimulated_expression_matrix.txt.gz", sep = ""), sep = "\t")
# create the Seurat object for the stimulated PBMCs
stim <- CreateSeuratObject(raw.data = stim.data, min.cells = 5, project = "stim_PBMC")
# Also re-create the control PBMC object because we will change a couple things this time and we don't want to have the previous info stored in the Seurat object.
pbmc <- CreateSeuratObject(raw.data = pbmc.data, min.cells = 5, project = "control_PBMC")
VlnPlot(object = stim, features.plot = c("nGene", "nUMI"), nCol = 2, point.size.use = 0.001)
GenePlot(object = stim, gene1 = "nUMI", gene2 = "nGene")
# Filter out the stimulated pbmcs with low total gene expression
# for this analysis, we want only the genes with at least average nGene
stim <- FilterCells(object = stim, subset.names = "nGene", low.thresholds = 500, high.thresholds = 1800)
# normalize
stim <- NormalizeData(stim)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# scale
stim <- ScaleData(stim)
Scaling data matrix
|
| | 0%
|
|====== | 7%
|
|=========== | 14%
|
|================= | 21%
|
|======================= | 29%
|
|============================= | 36%
|
|================================== | 43%
|
|======================================== | 50%
|
|============================================== | 57%
|
|=================================================== | 64%
|
|========================================================= | 71%
|
|=============================================================== | 79%
|
|===================================================================== | 86%
|
|========================================================================== | 93%
|
|================================================================================| 100%
# Find variable genes
stim <-FindVariableGenes(stim)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# make metadata indicating it is stimulated
stim@meta.data$stim <- "STIM"
# yes, we already did this for the control dataset, but the downstream analysis requires a bit more selective filtering for it to run. The only changes we are making is choosing cells with 500-1800 genes instead of 200-1800 genes.
pbmc <- FilterCells(object = pbmc, subset.names = "nGene", low.thresholds = 500, high.thresholds = 1800)
# normalize
pbmc <- NormalizeData(pbmc)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# scale
pbmc <- ScaleData(pbmc)
Scaling data matrix
|
| | 0%
|
|====== | 7%
|
|=========== | 14%
|
|================= | 21%
|
|======================= | 29%
|
|============================= | 36%
|
|================================== | 43%
|
|======================================== | 50%
|
|============================================== | 57%
|
|=================================================== | 64%
|
|========================================================= | 71%
|
|=============================================================== | 79%
|
|===================================================================== | 86%
|
|========================================================================== | 93%
|
|================================================================================| 100%
# Find variable genes
pbmc <-FindVariableGenes(pbmc)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# make metadata indicating it is stimulated
pbmc@meta.data$stim <- "CTRL"
# Now find the highly variable genes that are shared between the two datasets (control and stimulated)
g.1 <- head(rownames(pbmc@hvg.info), 1000)
g.2 <- head(rownames(stim@hvg.info), 1000)
# keeps only unique genenames (gets rid of duplicates)
genes.use <- unique(c(g.1, g.2))
genes.use <- intersect(genes.use, rownames(pbmc@scale.data))
genes.use <- intersect(genes.use, rownames(stim@scale.data))
# Run CCA to identify common sources of variation between the two datasets
# CCA finds linear combinations of features across the conditions that are maximally correlated. In short, it searches for patterns in the datasets that are common.
immune.combined <- RunCCA(pbmc, stim, genes.use = genes.use, num.cc = 30)
Running CCA
Merging objects
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling data matrix
|
| | 0%
|
|===== | 7%
|
|=========== | 13%
|
|================ | 20%
|
|===================== | 27%
|
|=========================== | 33%
|
|================================ | 40%
|
|===================================== | 47%
|
|=========================================== | 53%
|
|================================================ | 60%
|
|===================================================== | 67%
|
|=========================================================== | 73%
|
|================================================================ | 80%
|
|===================================================================== | 87%
|
|=========================================================================== | 93%
|
|================================================================================| 100%
# Visualize CCA results
# plot CC1 vs CC2
p1 <- DimPlot(object = immune.combined, reduction.use = "cca", group.by = "stim", pt.size = 0.5, do.return = TRUE)
# violin plot to visualize CC1 and CC2
p2 <- VlnPlot(object = immune.combined, features.plot = "CC1", group.by = "stim", do.return = TRUE, point.size.use = 0.001)
p3 <- VlnPlot(object = immune.combined, features.plot = "CC2", group.by = "stim", do.return = TRUE, point.size.use = 0.001)
plot(p1)
plot_grid(p2, p3)
# Much like selecting the number of PCs to use in the first analysis, we must select the number of CCs to use here. The MetagenBicorPlot function below is analogous to the elbow plot method used in the first analysis of 1 dataset. You look for saturation (flatline).
# 2 ways to pick CCs, but we won't run the first because it takes too long to compute for the time we have in class. Feel free to try it on your own!
# # 1. MetageneBicorPlot
p4 <- MetageneBicorPlot(immune.combined, grouping.var = "stim", dims.eval = 1:30, display.progress = TRUE)
Rescaling group 1
Scaling data matrix
|
| | 0%
|
|=========================== | 33%
|
|===================================================== | 67%
|
|================================================================================| 100%
Rescaling group 2
Scaling data matrix
|
| | 0%
|
|=========================== | 33%
|
|===================================================== | 67%
|
|================================================================================| 100%
Evaluating dims: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
| | 0%
|
|=== | 3%
|
|===== | 7%
|
|======== | 10%
|
|=========== | 13%
|
|============= | 17%
|
|================ | 20%
|
|=================== | 23%
|
|===================== | 27%
|
|======================== | 30%
|
|=========================== | 33%
|
|============================= | 37%
|
|================================ | 40%
|
|=================================== | 43%
|
|===================================== | 47%
|
|======================================== | 50%
|
|=========================================== | 53%
|
|============================================= | 57%
|
|================================================ | 60%
|
|=================================================== | 63%
|
|===================================================== | 67%
|
|======================================================== | 70%
|
|=========================================================== | 73%
|
|============================================================= | 77%
|
|================================================================ | 80%
|
|=================================================================== | 83%
|
|===================================================================== | 87%
|
|======================================================================== | 90%
|
|=========================================================================== | 93%
|
|============================================================================= | 97%
|
|================================================================================| 100%
# 2. Heatmap - use the top 500 cells
# you need three pages to see all the CCs
# purple = low expression
# yellow = high
DimHeatmap(object = immune.combined, reduction.type = "cca", cells.use = 500, dim.use = 1:9,
do.balanced = TRUE)
DimHeatmap(object = immune.combined, reduction.type = "cca", cells.use = 500, dim.use = 10:18,
do.balanced = TRUE)
DimHeatmap(object = immune.combined, reduction.type = "cca", cells.use = 500, dim.use = 19:30,
do.balanced = TRUE)
# How many CCs do you think we should pick?
# use the first 20 CCs to get a new dimension reduction that you can visualize and use for clustering
immune.combined <- AlignSubspace(immune.combined, reduction.type = "cca", grouping.var = "stim",
dims.align = 1:20)
Rescaling group 1
Scaling data matrix
|
| | 0%
|
|===== | 7%
|
|=========== | 13%
|
|================ | 20%
|
|===================== | 27%
|
|=========================== | 33%
|
|================================ | 40%
|
|===================================== | 47%
|
|=========================================== | 53%
|
|================================================ | 60%
|
|===================================================== | 67%
|
|=========================================================== | 73%
|
|================================================================ | 80%
|
|===================================================================== | 87%
|
|=========================================================================== | 93%
|
|================================================================================| 100%
Rescaling group 2
Scaling data matrix
|
| | 0%
|
|===== | 7%
|
|=========== | 13%
|
|================ | 20%
|
|===================== | 27%
|
|=========================== | 33%
|
|================================ | 40%
|
|===================================== | 47%
|
|=========================================== | 53%
|
|================================================ | 60%
|
|===================================================== | 67%
|
|=========================================================== | 73%
|
|================================================================ | 80%
|
|===================================================================== | 87%
|
|=========================================================================== | 93%
|
|================================================================================| 100%
Aligning dimension 1
| | 0 % ~calculating
|+ | 1 % ~04h 35m 59s
# Run t-SNE
immune.combined <- Seurat::RunTSNE(immune.combined, reduction.use = "cca.aligned", dims.use = 1:20, do.fast = T)
# cluster based on t-SNE space
immune.combined <- FindClusters(immune.combined, reduction.type = "cca.aligned", resolution = 0.6, dims.use = 1:20)
# Visualize the dataset alignment and combined clustering results on t-SNE
p1 <- TSNEPlot(immune.combined, do.return = T, pt.size = 0.5, group.by = "stim")
p2 <- TSNEPlot(immune.combined, do.label = T, do.return = T, pt.size = 0.5)
plot_grid(p1, p2)
# Identify conserved cell type markers
# Conserved cell type makres are those that identify a particular cell type in both control pbmc and stimulated pbmc). The FindConservedmarkers function uses differential gene expression analysis to do this.
# As an example, let's look for markers that are conserved between control and stimulated cells in cluster 7, defined in the "ident.1" argument.
cluster7.markers <- FindConservedMarkers(immune.combined, ident.1 = 7, grouping.var = "stim", print.bar = FALSE)
# view the first few markers
cluster7.markers[1:9,]
# Confirm that those markers for cluster 7 identified fall into that location on t-SNE.
FeaturePlot(object = immune.combined, features.plot = rownames(cluster7.markers)[1:9], min.cutoff = "q9", cols.use = c("lightgrey", "blue"), pt.size = 0.5)
# Based on those results, what cell type is cluster 7?
# DO NOT RUN THIS MORE THAN ONCE
# Explore markers of different immune cell populations to try to identify what cell type each cluster contains. Select candidates based off of prior knowledge of immune cell markers.
FeaturePlot(object = immune.combined, features.plot = c("CD3D", "SELL", "CREM", "CD8A", "GNLY", "CD79A", "FCGR3A", "CCL2", "PPBP"), min.cutoff = "q9", cols.use = c("lightgrey", "blue"), pt.size = 0.5)
# Now, you can rename your clusters as these cell names. Trust that they are correct :)
new.ident <- c("CD14 Mono", "CD4 Naive T", "CD4 Memory T", "B", "CD16 Mono",
"T activated", "CD8 T", "NK", "DC", "B activated", "Mk", "pDC", "Eryth")
for (i in 0:12) {
immune.combined <- RenameIdent(object = immune.combined, old.ident.name = i,
new.ident.name = new.ident[i + 1])
}
# Run t-SNE to see your new cluster names
TSNEPlot(immune.combined, do.label = T, pt.size = 0.5)
use SPlitDotPlotGG to plot markers of each cell type (using prior knowledge again).
immune.combined@ident <- factor(immune.combined@ident, levels = (c("pDC", "Eryth",
"Mk", "DC", "CD14 Mono", "CD16 Mono", "B activated", "B", "CD8 T", "NK",
"T activated", "CD4 Naive T", "CD4 Memory T")))
markers.to.plot <- c("CD3D", "CREM", "HSPH1", "SELL", "GIMAP5", "CACYBP", "GNLY",
"NKG7", "CCL5", "CD8A", "MS4A1", "CD79A", "MIR155HG", "NME1", "FCGR3A",
"VMO1", "CCL2", "S100A9", "HLA-DQA1", "GPR183", "PPBP", "GNG11", "HBA2",
"HBB", "TSPAN13", "IL3RA", "IGJ")
sdp <- SplitDotPlotGG(immune.combined, genes.plot = rev(markers.to.plot), cols.use = c("blue",
"red"), x.lab.rot = T, plot.legend = T, dot.scale = 3, do.return = T, grouping.var = "stim")
# It's great that we can identify conserved markers across datasets because it allows us to be confident that we have identified subpopulations of cell types that are present in both datasets, ctrl vs stimulated. However, what is really interesting is what CHANGES when you stimulate the cells. Let's find out.
# First we need to define some plotting functions to make labeling easier. Don't worry about trying to understand what each line is doing, it is not interesting. Just run it!
LabelPoint <- function(plot, genes, exp.mat, adj.x.t = 0, adj.y.t = 0, adj.x.s = 0,
adj.y.s = 0, text.size = 2.5, segment.size = 0.1) {
for (i in genes) {
x1 <- exp.mat[i, 1]
y1 <- exp.mat[i, 2]
plot <- plot + annotate("text", x = x1 + adj.x.t, y = y1 + adj.y.t,
label = i, size = text.size)
plot <- plot + annotate("segment", x = x1 + adj.x.s, xend = x1, y = y1 +
adj.y.s, yend = y1, size = segment.size)
}
return(plot)
}
LabelUR <- function(plot, genes, exp.mat, adj.u.t = 0.1, adj.r.t = 0.15, adj.u.s = 0.05,
adj.r.s = 0.05, ...) {
return(LabelPoint(plot, genes, exp.mat, adj.y.t = adj.u.t, adj.x.t = adj.r.t,
adj.y.s = adj.u.s, adj.x.s = adj.r.s, ...))
}
LabelUL <- function(plot, genes, exp.mat, adj.u.t = 0.1, adj.l.t = 0.15, adj.u.s = 0.05,
adj.l.s = 0.05, ...) {
return(LabelPoint(plot, genes, exp.mat, adj.y.t = adj.u.t, adj.x.t = -adj.l.t,
adj.y.s = adj.u.s, adj.x.s = -adj.l.s, ...))
}
# Now, let's see how naive T cells respond to stimulation with interferon gamma.
t.cells <- SubsetData(immune.combined, ident.use = "CD4 Naive T", subset.raw = T)
t.cells <- SetAllIdent(t.cells, id = "stim")
avg.t.cells <- log1p(AverageExpression(t.cells, show.progress = FALSE))
avg.t.cells$gene <- rownames(avg.t.cells)
p1 <- ggplot(avg.t.cells, aes(CTRL, STIM)) + geom_point() + ggtitle("CD4 Naive T Cells")
plot(p1)
# Let's also see how CD14 monocytes respond to stimulation with interferon gamma.
cd14.mono <- SubsetData(immune.combined, ident.use = "CD14 Mono", subset.raw = T)
cd14.mono <- SetAllIdent(cd14.mono, id = "stim")
avg.cd14.mono <- log1p(AverageExpression(cd14.mono, show.progress = FALSE))
avg.cd14.mono$gene <- rownames(avg.cd14.mono)
p2 <- ggplot(avg.cd14.mono, aes(CTRL, STIM)) + geom_point() + ggtitle("CD14 Monocytes")
plot(p2)
# If you were to go in and find the genes that lie above the linear correlation, you would find these:
genes.to.label1 = c("ISG15", "LY6E", "IFI6", "ISG20", "MX1")
genes.to.label2 = c("IFIT2", "IFIT1")
genes.to.label3 = c("CXCL10", "CCL8")
# Now, plot them on the scatterplots and see where they fall. These end up being the genes that respond specifically to interferon gamma stimulation, both in naive T cells and CD14 monocytes - an interferon gamma response pathway that many cells have.
p1 <- LabelUR(p1, genes = c(genes.to.label1, genes.to.label2), avg.t.cells,
adj.u.t = 0.3, adj.u.s = 0.23)
p1 <- LabelUL(p1, genes = genes.to.label3, avg.t.cells, adj.u.t = 0.5, adj.u.s = 0.4,
adj.l.t = 0.25, adj.l.s = 0.25)
p2 <- LabelUR(p2, genes = c(genes.to.label1, genes.to.label3), avg.cd14.mono,
adj.u.t = 0.3, adj.u.s = 0.23)
p2 <- LabelUL(p2, genes = genes.to.label2, avg.cd14.mono, adj.u.t = 0.5, adj.u.s = 0.4,
adj.l.t = 0.25, adj.l.s = 0.25)
plot_grid(p1,p2)
# Now, look for responses specific to particular cell types.
# code to grab particular cell types
immune.combined@meta.data$celltype.stim <- paste0(immune.combined@ident, "_",
immune.combined@meta.data$stim)
immune.combined <- StashIdent(immune.combined, save.name = "celltype")
immune.combined <- SetAllIdent(immune.combined, id = "celltype.stim")
# pDC
pDC.interferon.response <- FindMarkers(immune.combined, ident.1 = "pDC_STIM", ident.2 = "pDC_CTRL", print.bar = FALSE)
head(pDC.interferon.response, 15)
# Eryth
Eryth.interferon.response <- FindMarkers(immune.combined, ident.1 = "Eryth_STIM", ident.2 = "Eryth_CTRL", print.bar = FALSE)
head(Eryth.interferon.response, 15)
# Mk
Mk.interferon.response <- FindMarkers(immune.combined, ident.1 = "Mk_STIM", ident.2 = "Mk_CTRL", print.bar = FALSE)
head(Mk.interferon.response, 15)
# DC
DC.interferon.response <- FindMarkers(immune.combined, ident.1 = "DC_STIM", ident.2 = "DC_CTRL", print.bar = FALSE)
head(DC.interferon.response, 15)
# CD14 monocytes
CD14mono.interferon.response <- FindMarkers(immune.combined, ident.1 = "CD14 Mono_STIM", ident.2 = "CD14 Mono_CTRL", print.bar = FALSE)
head(CD14mono.interferon.response, 15)
# CD16 monocytes
CD16mono.interferon.response <- FindMarkers(immune.combined, ident.1 = "CD16 Mono_STIM", ident.2 = "CD16 Mono_CTRL", print.bar = FALSE)
head(CD16mono.interferon.response, 15)
# B activated
Bactiv.interferon.response <- FindMarkers(immune.combined, ident.1 = "B activated_STIM", ident.2 = "B activated_CTRL", print.bar = FALSE)
head(Bactiv.interferon.response, 15)
# B cells
b.interferon.response <- FindMarkers(immune.combined, ident.1 = "B_STIM", ident.2 = "B_CTRL",
print.bar = FALSE)
head(b.interferon.response, 15)
# CD8 T cells
CD8T.interferon.response <- FindMarkers(immune.combined, ident.1 = "CD8 T_STIM", ident.2 = "CD8 T_CTRL",
print.bar = FALSE)
head(CD8T.interferon.response, 15)
# NK cells (cluster 7)
NK.interferon.response <- FindMarkers(immune.combined, ident.1 = "NK_STIM", ident.2 = "NK_CTRL",
print.bar = FALSE)
head(NK.interferon.response, 15)
# T activated cells
Tactiv.interferon.response <- FindMarkers(immune.combined, ident.1 = "T activated_STIM", ident.2 = "T activated_CTRL",
print.bar = FALSE)
head(Tactiv.interferon.response, 15)
# CD4 naive T cells
CD4naiveT.interferon.response <- FindMarkers(immune.combined, ident.1 = "CD4 Naive T_STIM", ident.2 = "CD4 Naive T_CTRL", print.bar = FALSE)
head(CD4naiveT.interferon.response, 15)
# CD4 Memory T cells
CD4MemT.interferon.response <- FindMarkers(immune.combined, ident.1 = "CD4 Memory T_STIM", ident.2 = "CD4 Memory T_CTRL", print.bar = FALSE)
head(CD4MemT.interferon.response, 15)
# p_val = p-value,
# avg_logFC = average log fold change,
# pct.1 = percentage of cells where the gene is detected in the first group,
# pct.2 = percentage of cells where the gene is detected in the second group
# p_val_adj = adjusted p-value
all_genes<-c(rownames(pDC.interferon.response), rownames(Eryth.interferon.response), rownames(Mk.interferon.response), rownames(DC.interferon.response), rownames(CD14mono.interferon.response), rownames(CD16mono.interferon.response), rownames(Bactiv.interferon.response), rownames(b.interferon.response), rownames(CD8T.interferon.response), rownames(NK.interferon.response), rownames(Tactiv.interferon.response), rownames(CD4naiveT.interferon.response), rownames(CD4MemT.interferon.response))
cell_type_index<-c(length(rownames(pDC.interferon.response)), length(rownames(Eryth.interferon.response), rownames(Mk.interferon.response)), length(rownames(DC.interferon.response)), length(rownames(CD14mono.interferon.response)), length(rownames(CD16mono.interferon.response)), length(rownames(Bactiv.interferon.response)), length(rownames(b.interferon.response)), length(rownames(CD8T.interferon.response)), length(rownames(NK.interferon.response)), length(rownames(Tactiv.interferon.response)), length(rownames(CD4naiveT.interferon.response)), length(rownames(CD4MemT.interferon.response)))
unique_response_genes <- which(table(all_genes)==1)
# Now visualize the top 8 fold changes for these 3 groups of cells. Are these unique responses? How would we find cell-type specific responses?
# FeatureHeatmap
# CD14 monocytes
FeatureHeatmap(immune.combined, features.plot = rownames(CD14mono.interferon.response)[1:8], group.by = "stim", pt.size = 0.25, key.position = "top", max.exp = 3)
# CD4 naive T cells
FeatureHeatmap(immune.combined, features.plot = rownames(CD4naiveT.interferon.response)[1:8], group.by = "stim", pt.size = 0.25, key.position = "top", max.exp = 3)
# B cells
FeatureHeatmap(immune.combined, features.plot = rownames(b.interferon.response)[1:8], group.by = "stim", pt.size = 0.25, key.position = "top", max.exp = 3)
# save this work and come back to it later
saveRDS(pbmc, file = paste(directory, "/pbmc_combined.rds", sep = ""))
saveRDS(stim, file = paste(directory, "/stim_combined.rds", sep = ""))
saveRDS(immune.combined, file = paste(directory, "/immune_combined.rds", sep = ""))